// Timer.h
#ifndef TOOLS_TIMER_H
#define TOOLS_TIMER_H

#include <iostream>
#include <chrono>
#include <functional>
#include <memory>
#include <vector>
#include <list>
#include <thread>
#include <mutex>
#include <atomic>
#include <cstdint>
#include "Global.h"

namespace Tool
{

struct TimerTask
{
    using Callback = std::function<void()>;

    TimerTask(uint64_t delay_ms, Callback callback, bool is_one_shot)
        : delay_ms(delay_ms)
        , callback(std::move(callback))
        , is_one_shot(is_one_shot)
        , remaining_rounds(0)
    {

    }

    uint64_t delay_ms;          // 延迟时间(毫秒)
    Callback callback;          // 回调函数
    bool is_one_shot;           // 是否为一次性任务
    uint64_t remaining_rounds;  // 剩余轮次
};

class ExportAPI Timer
{
public:
    // 时间轮参数：槽数量和每个槽的时间间隔(毫秒)
    explicit Timer(size_t slot_count = 60, uint64_t slot_interval_ms = 100);
    ~Timer();

    Timer(const Timer&) = delete;
    Timer& operator=(const Timer&) = delete;
    Timer(Timer&&) = delete;
    Timer& operator=(Timer&&) = delete;

    void Reset();                           // 重置计时
    double Elapsed() const;                 // 毫秒
    double ElapsedNanoseconds() const;      // 纳秒

    // 静态休眠函数
    static void SleepMs(int64_t ms);        // 毫秒
    static void SleepUs(int64_t us);        // 微秒

    // 时间轮任务管理
    // 添加定时任务，返回任务ID(用于移除)
    uint64_t AddTask(uint64_t delay_ms, TimerTask::Callback callback, bool is_one_shot = false);
    bool RemoveTask(uint64_t task_id);
    void StopAllTasks();
    bool IsRunning() const;

private:
    struct TimerPrivater;
    std::unique_ptr<TimerPrivater> m_privater;
};
}
#endif // TIMER_H
